package evol

import java.awt.TexturePaintContext.Int;
import java.text.DecimalFormat;
import java.util.concurrent.ForkJoinPool;

import grails.converters.XML
import org.springframework.dao.DataIntegrityViolationException

import com.sun.xml.internal.messaging.saaj.packaging.mime.internet.ContentType;
import groovy.util.XmlParser
import groovy.xml.MarkupBuilder

class PredmetController extends OsnovniController {

	static allowedMethods = [save: "POST", update: "POST", delete: "POST"]


	def beforeInterceptor = [action:this.&auth,except:[
			"PodaciZaPrikaz",
			"Odgovori",
			"drugo",
			"Predmeti"
		]]

	def index() {
		redirect(action: "list", params: params)
	}

	def list() {
		params.max = Math.min(params.max ? params.int('max') : 10, 100)
		[predmetInstanceList: Predmet.list(params), predmetInstanceTotal: Predmet.count()]
	}

	def create() {
		[predmetInstance: new Predmet(params)]
	}

	def save() {
		def predmetInstance = new Predmet(params)
		if (!predmetInstance.save(flush: true)) {
			render(view: "create", model: [predmetInstance: predmetInstance])
			return
		}

		flash.message = message(code: 'default.created.message', args: [
			message(code: 'predmet.label', default: 'Predmet'),
			predmetInstance.id
		])
		redirect(action: "show", id: predmetInstance.id)
	}

	def show() {
		def predmetInstance = Predmet.get(params.id)
		if (!predmetInstance) {
			flash.message = message(code: 'default.not.found.message', args: [
				message(code: 'predmet.label', default: 'Predmet'),
				params.id
			])
			redirect(action: "list")
			return
		}

		[predmetInstance: predmetInstance]
	}

	def edit() {
		def predmetInstance = Predmet.get(params.id)
		if (!predmetInstance) {
			flash.message = message(code: 'default.not.found.message', args: [
				message(code: 'predmet.label', default: 'Predmet'),
				params.id
			])
			redirect(action: "list")
			return
		}

		[predmetInstance: predmetInstance]
	}

	def update() {
		def predmetInstance = Predmet.get(params.id)
		if (!predmetInstance) {
			flash.message = message(code: 'default.not.found.message', args: [
				message(code: 'predmet.label', default: 'Predmet'),
				params.id
			])
			redirect(action: "list")
			return
		}

		if (params.version) {
			def version = params.version.toLong()
			if (predmetInstance.version > version) {
				predmetInstance.errors.rejectValue("version", "default.optimistic.locking.failure",
						[
							message(code: 'predmet.label', default: 'Predmet')]
						as Object[],
						"Another user has updated this Predmet while you were editing")
				render(view: "edit", model: [predmetInstance: predmetInstance])
				return
			}
		}

		predmetInstance.properties = params

		if (!predmetInstance.save(flush: true)) {
			render(view: "edit", model: [predmetInstance: predmetInstance])
			return
		}

		flash.message = message(code: 'default.updated.message', args: [
			message(code: 'predmet.label', default: 'Predmet'),
			predmetInstance.id
		])
		redirect(action: "show", id: predmetInstance.id)
	}

	def delete() {
		def predmetInstance = Predmet.get(params.id)
		if (!predmetInstance) {
			flash.message = message(code: 'default.not.found.message', args: [
				message(code: 'predmet.label', default: 'Predmet'),
				params.id
			])
			redirect(action: "list")
			return
		}

		try {
			predmetInstance.delete(flush: true)
			flash.message = message(code: 'default.deleted.message', args: [
				message(code: 'predmet.label', default: 'Predmet'),
				params.id
			])
			redirect(action: "list")
		}
		catch (DataIntegrityViolationException e) {
			flash.message = message(code: 'default.not.deleted.message', args: [
				message(code: 'predmet.label', default: 'Predmet'),
				params.id
			])
			redirect(action: "show", id: params.id)
		}
	}

	def PodaciZaPrikaz(){



		render( contentType: "text/xml" ,encoding:"UTF-8") {
			podaciZaPrikaz{
				imeKorisnika{naziv (session.user)}
				listaPredmeta{
					for(pred in Predmet.getAll()){
						predmet {naziv(pred.naziv)}
					}
				}
				listaIstrazivanja{
					for(istr in Istrazivanje.getAll()){
						def oi=istr
						istrazivanje {naziv(istr.naziv)}
					}
				}
				smerovi{ smer{naziv("isit")}}
			}
		}
	}

	def Odgovori(){
		def xml =params.xml

		def o

		def odgovori=new XmlParser().parseText(xml)

		odgovori.each {
			o=new Odgovor()
			o.korisnik=it.@'korisnik'
			def p1=new Predmet()
			p1.id=Integer.valueOf( it.idod.text())
			if(p1.id==0)p1.id=1
			def p2=new Predmet()
			p2.id=Integer.valueOf(it.iddo.text())
			if(p2.id==0)p2.id=1
			o.idOd =p1
			o.idDo=p2
			o.indeks=Float.valueOf(it.indeks.text())
			o.datum=new Date()
			o.save()
		}
	}

	def Predmeti(){

		def pr= Predmet.findByNaziv ( params.predmet)
		def krit= params.kriterijum

		def lista =Odgovor.findAllByIdDo(pr)// Rezultat.findAllByPredmet1(pr)

		if(lista.size()>4)
		{
			render( contentType: "text/xml" ) {

				predmeti{
					
					predmet {
						id(pr.id)
						naziv(pr.naziv)
						//indeks(o.indeks)
						boja(pr.boja)

					}
					for(Odgovor o in lista ){
						def pred=o.idOd
						if(pred.id==pr.id)continue
						predmet {
							id(pred.id)
							naziv(pred.naziv)
							indeks(o.indeks)
							boja(pred.boja)

						}
					}
				}


			}
			return
		}
		def xml=new File(servletContext.getRealPath("/")+"/files/"+"Predmeti.xml")

		xml=xml.text

		render( contentType: "text/xml",text:xml )




	}

	///---
	def istrazivanje () {

		ArrayList<Rezultat> rezList= new ArrayList<Rezultat>()

		def dva = params

		def odgovori=params.xml
		def parser=new XmlParser().parseText(odgovori)

		def sizeMap=parser.entry.size()

		for(int i=0; i<sizeMap;i++){

			def pred1=parser.entry[i].predmet[0]
			def pred2=parser.entry[i].predmet[1]
			if(pred1.'@id'==null||pred2.'@id'==null)
			{continue}

			def predmet1=Long.parseLong(pred1.'@id')

			def predmet2= Long.parseLong(pred2.'@id')


			def korisnik=session.user		//uzima se trenutna vrednost sesije
			def istra=params.idI

			///prosek
			def averege = Odgovor.executeQuery("select avg(indeks) from Odgovor where idDo.id=:a and idOd.id=:b",[a: predmet1,b:predmet2])

			def rezultat=new Rezultat()
			def g
			if(averege.get(0)==null)g=0


			else g=((double)averege.get(0))

			//ako hoces da se ne unose svi parametri, u bazi podesi "allow null"

			rezultat.indeks=Float.parseFloat(new DecimalFormat("#.##").format(g))
			rezultat.korisnik=Korisnik.find(korisnik)
			rezultat.predmet1= Predmet.findById(predmet1)
			rezultat.predmet2= Predmet.findById(predmet2)
			//rezultat.version=1l
			rezultat.istrazivanje=Istrazivanje.findById(istra)

			def rTemp= Rezultat.findByPredmet1AndPredmet2(rezultat.predmet1, rezultat.predmet2)
			if(rTemp!=null)rezList.add(rezultat)
			else {
				rezList.add(rezultat)
				//rezultat.update= null
				rezultat.save(flush:true)
			}
			//	params.put(i, rezultat)
		}
		redirect(controller:'rezultat',action:'list',params:rezList)

	}


}
